package hk.m4s.lr.repair.test.utils;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Environment;
/**
 * 图片等文件读取和保存工具类
 * 
 * @author wq
 * 
 */
public class MediaFileManager {

	/**
	 * 读取图片
	 * 
	 * @param context
	 *            上下文对象
	 * @param phone
	 *            用户手机号码
	 * @param fileName
	 *            文件名(相对路径)
	 * @return 判断指定文件是否存在
	 */
	public static boolean fileExists(Context context, String phone,
			String fileName) {
		File file = new File(Environment.getExternalStorageDirectory(),
				 "uelive/" + fileName);
		// 如果存贮卡上有图片就从存储卡读取，否则就从本机读取
		if (file.exists()) {
			return true;
		} else {
			file = new File(context.getFilesDir().getPath() + "uelive/" + fileName);
			if (file.exists()) {
				return true;
			}
		}
		return false;
	}

	/**
	 * 读取图片
	 * 
	 * @param context
	 *            上下文对象
	 * @param phone
	 *            用户手机号码
	 * @param fileName
	 *            文件名(相对路径)
	 * @return 读取出的图片
	 */
	public static Bitmap readBitmap(Context context, String phone,
			String fileName) {
		Bitmap bitmap = null;
		File file = new File(Environment.getExternalStorageDirectory(),
				 "uelive/" + fileName);
		// 如果存贮卡上有图片就从存储卡读取，否则就从本机读取
		if (file.exists()) {
			bitmap = BitmapFactory.decodeFile(file.getPath());
		} else {
			file = new File(context.getFilesDir().getPath() + "uelive/" + fileName);
			if (file.exists()) {
				bitmap = BitmapFactory.decodeFile(file.getPath());
			}
		}
		return bitmap;
	}

	/**
	 * 创建指定文件名的文件对象
	 * 
	 * @param context
	 *            上下文对象
	 * @param phone
	 *            用户手机号码
	 * @param fileName
	 *            文件名
	 * @return 指定文件名的文件对象
	 */
	public static File makeFile(Context context, String phone, String fileName) {
		File rootDir = new File(Environment.getExternalStorageDirectory(),
				"uelive/");
		File file = null;
		// 如果有存贮卡就存在存储卡上，否则就存在本机
		if (rootDir.exists() || rootDir.mkdirs()) {
			file = new File(rootDir.getPath() + "/" + fileName);
		} else {
			file = new File(context.getFilesDir().getPath() +"uelive/"+ fileName);
			if (!file.getParentFile().exists()) {
				file.getParentFile().mkdirs();
			}
		}
		return file;
	}

	/**
	 * 读取指定文件名的文件对象
	 * 
	 * @param context
	 *            上下文对象
	 * @param phone
	 *            用户手机号码
	 * @param fileName
	 *            文件名
	 * @return 指定文件名的件对象
	 */
	public static File readFile(Context context, String phone, String fileName) {
		File file = new File(Environment.getExternalStorageDirectory(),
				"uelive/" + fileName);
		// 如果存贮卡上有图片就从存储卡读取，否则就从本机读取
		if (!file.exists()) {
			file = new File(context.getFilesDir().getPath() + "uelive/"+ fileName);
			if (!file.exists()) {
				file = null;
			}
		}
		return file;
	}

	/**
	 * 保存文件到本地
	 * 
	 * @param context
	 *            上下文对象
	 * @param phone
	 *            用户手机号码
	 * @param fileName
	 *            文件名
	 * @param data
	 *            文件字节数组
	 */
	public static File writeFile(Context context, String phone,
			String fileName, byte[] data) {
		File rootDir = new File(Environment.getExternalStorageDirectory(),
				"uelive/");
		File rootDirs = new File(Environment.getExternalStorageDirectory(),
				"uelive/"+ ".nomedia");
		File file = null;
	
		if (rootDir.exists() || rootDir.mkdirs()) {
			file = new File(rootDir.getPath() + "/" + fileName);
		} else {
			file = new File(context.getFilesDir().getPath() + "uelive/"+ fileName);
			if (!file.getParentFile().exists()) {
				file.getParentFile().mkdirs();
			}
		}
		
		if (file.exists()) {
			file.delete();
		}
		FileOutputStream fos = null;
		try {
			fos = new FileOutputStream(file);
			fos.write(data);

		} catch (FileNotFoundException e) {
		} catch (IOException e) {
		} finally {
			try {
				if (fos != null) {
					fos.close();
					fos = null;
				}
			} catch (IOException e) {
			}
		}
		return file;
	}

	/**
	 * 删除图片或语音文件
	 * 
	 * @param context
	 *            上下文对象
	 * @param phone
	 *            用户手机号码
	 * @param fileName
	 *            文件名(相对路径)
	 */
	public static void delete(Context context, String phone, String fileName) {
		File file = new File(Environment.getExternalStorageDirectory(),
				"uelive/" + fileName);
		// 如果存贮卡上有图片就从存储卡读取，否则就从本机读取
		if (file.exists()) {
			file.delete();
		} else {
			file = new File(context.getFilesDir().getPath() + "uelive/"+ fileName);
			if (file.exists()) {
				file.delete();
			}
		}
	}

	/**
	 * 下载文件
	 * 
	 * @param fileUrl
	 *            文件url路径
	 * @return 文件字节数组
	 */
	public static byte[] downloadFile(String fileUrl) {
		byte[] b = null;
		try {
			URL url = new URL(fileUrl);
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			conn.setDefaultUseCaches(false);
			conn.setUseCaches(false);
			conn.setConnectTimeout(60000);
			conn.setReadTimeout(600000);
			// conn.addRequestProperty("User-Agent", "av2_2013");
			InputStream is = null;
			// // 超时后断开重连，最多5次
			// for (int i = 0; i < 5; i++) {
			// try {
			is = conn.getInputStream();
			// if (is != null) {
			// break;
			// }
			// } catch (Exception e) {
			// }
			// }
			if (is == null) {
				return null;
			}
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			final byte[] tmp = new byte[409600];
			int l = 0;
			while ((l = is.read(tmp)) != -1) {
				baos.write(tmp, 0, l);
			}
			baos.flush();
			if (is != null) {
				is.close();
			}
			if (conn != null) {
				conn.disconnect();
				conn = null;
			}
			b = baos.toByteArray();
			baos.close();
		} catch (Exception e) {
			return null;
		}
		return b;
	}

	/**
	 * 计算图片最小取样大小
	 * 
	 * @param options
	 * @param maxLength
	 *            最大边长
	 */
	private static void calculateInSampleSize(BitmapFactory.Options options,
			int maxLength) {
		final int height = options.outHeight;
		final int width = options.outWidth;
		options.inSampleSize = 1;
		if (width < height) {
			if (height > maxLength) {
				options.inSampleSize = (int) Math.round(height / maxLength);
			}
		} else {
			if (width > maxLength) {
				options.inSampleSize = (int) Math.round(width / maxLength);
			}
		}
	}

	/**
	 * 读取指定宽高的图片：防止内存溢出
	 * 
	 * @param res
	 * @param resId
	 * @param maxLength
	 *            最大边长
	 * @return
	 */
	public static Bitmap decodeSampledBitmapFromResource(Resources res,
			int resId, int maxLength) {
		final BitmapFactory.Options options = new BitmapFactory.Options();
		options.inJustDecodeBounds = true;
		BitmapFactory.decodeResource(res, resId, options);
		calculateInSampleSize(options, maxLength);
		options.inJustDecodeBounds = false;
		return BitmapFactory.decodeResource(res, resId, options);
	}

	/**
	 * 读取指定宽高的图片：防止内存溢出
	 * 
	 * @param file
	 * @param maxLength
	 *            最大边长
	 * @return
	 */
	public static Bitmap decodeSampledBitmapFromFile(File file, int maxLength) {
		final BitmapFactory.Options options = new BitmapFactory.Options();
		options.inJustDecodeBounds = true;
		BitmapFactory.decodeFile(file.getAbsolutePath(), options);
		calculateInSampleSize(options, maxLength);
		options.inJustDecodeBounds = false;
		return BitmapFactory.decodeFile(file.getAbsolutePath(), options);
	}
}
